//
// Created by wujehy on 2020/7/9.
//

#ifndef DAOFACTORYLIBRARY_TIMERTASK_H
#define DAOFACTORYLIBRARY_TIMERTASK_H

#include <map>
#include <functional>
#include <memory>
#include <mutex>
#include <vector>
#include <thread>

/**
 * @brief 该定时任务 暂未加锁
 */
namespace GeeJoan
{
    namespace Common
    {
        typedef std::function<void()> Task;
        typedef std::shared_ptr<Task> Task_Ptr;

        class TimerTask
        {
        private:
//    mutable std::mutex m_lock;
            std::map<int64_t, std::shared_ptr<std::vector<int64_t>>> time_taskids_map;
            std::map<int64_t, Task> taskid_task_map;
            int64_t m_taskid = 0;
            bool m_do_run = true;
            std::thread m_hander;

        public:
            /**
             * @brief　添加一个任务　
             * @param time 触发的时间　, 秒的时间戳　
             * @param task
             * @return
             */
            int64_t addTask(int64_t time, Task task);

            /**
             * @brief 移除一个任务
             * @param taskid
             * @return
             */
            int removeTask(int64_t taskid);

            /**
             * @brief 执行任务
             * @param taskid
             */
            void runTask(int64_t taskid);

            /**
             * @brief 设置运行状态 , 运行中传入 false 将会停止线程
             * @param mDoRun
             */
            void setDoRun(bool mDoRun);

            int join();

            /**
             * @brief 初始化线程 , 请勿重复 初始化 ,暂为加锁 建议使用一个 单例管理
             *
             */
            void init();

            /**
             * @brief　获取当前时间戳 秒
             * @return
             */
            int64_t getCurrentTime();
        };
    }
}
#endif //DAOFACTORYLIBRARY_TIMERTASK_H
